<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="utf-8">
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <meta http-equiv="Content-Style-Type" content="text/css">
  <script src='../bbs.js'></script>

  <!-- Global site tag (gtag.js) - Google Analytics -->
  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-120820034-1"></script>

  <link href="../bbs.css" type="text/css" rel="stylesheet">
  <link rel="shortcut icon" href="/favicon.ico">
  <title>テーブル整形 PerlScript | サクラエディタ過去ログ</title>
</head>
<body>
<ul class="side">
        <a href="./" class="toindex">◀マクロトップへ</a>
        <li><div class="list-title">
    <span class="no">220</span>
    <a class="thread-title" href="220.html#220">テーブル整形 PerlScript</a></div>
    </li>
    </ul><ul class="main"><li><section><h1 id=220>
    <span class="no">[220]</span>
    <a class="thread-title" href="#220">テーブル整形 PerlScript</a>
    <span class="author">りーや</span>
    <time datetime="2005-09-25T09:45:20">2005年09月25日 09:45</time></h1>
    <div class="body"># タブ区切りのテーブル整形<br># table.pls<br>$[ = 1;&#9;&#9;&#9;# set array base to 1<br>$FS = "\t";&#9;&#9;# set field separator<br>$blanks = sprintf('%100s', ' ');<br>$number = "^[+-]?([0-9,]+[.]?[0-9]*|[.][0-9]+)\$";<br><br>$str = $Editor-&gt;GetSelectedString(0);&#9;# 選択部分の文字列を取得<br>if(! $str){exit;}&#9;# 選択範囲がなければ終了<br><br># 各行を一行ずつ処理、一巡目で各項目の最大桁取得<br>foreach(split(/\r\n/,$str)){<br>    chomp;&#9;# strip record separator<br>&#9;$NR++;<br>    @Fld = split($FS, $_, 9999);<br>    $row{$NR} = $_;&#9;&#9;# 項目数<br>    for ($i = 1; $i &lt;= $#Fld; $i++) {&#9;# 各フィールドの処理<br>&#9;if ($Fld[$i] =~ $number) {&#9;# 数字<br>&#9;&#9;if($Fld[$i] =~ /\./) {<br>&#9;&#9;&#9;($int[$i], $fra[$i]) = split(/\./, $Fld[$i]);<br>&#9;&#9;&#9;$iwid{$i} = &amp;max($iwid{$i}, length($int[$i]));&#9;# 整数<br>&#9;&#9;&#9;$fwid{$i} = &amp;max($fwid{$i}, length($fra[$i]));&#9;# 小数<br>&#9;&#9;&#9;$nwid{$i} = &amp;max($nwid{$i}, $iwid{$i}+$fwid{$i}+1);<br>&#9;&#9;} else {<br>&#9;&#9;&#9;$iwid{$i} = &amp;max($iwid{$i}, length($Fld[$i]));<br>&#9;&#9;&#9;$nwid{$i} = &amp;max($nwid{$i}, $iwid{$i});<br>&#9;&#9;}<br>&#9;&#9;$wid{$i} = &amp;max($wid{$i}, $nwid{$i});<br>&#9;}<br>&#9;&#9;$wid{$i} = &amp;max($wid{$i}, length($Fld[$i]));<br>    }<br>}<br><br># 各行を作業エリアから再処理、二巡目で編集出力<br>for ($r = 1; $r &lt;= $NR; $r++) {<br>    $n = (@d = split($FS, $row{$r}, 9999));<br>    for ($i = 1; $i &lt;= $n; $i++) {<br>&#9;&#9;$sep = ($i &lt; $n) ? '  ' : "\r\n";&#9;#???<br>&#9;&#9;if ($d[$i] =~ $number) {<br>&#9;&#9;    $rtn .= sprintf('%' . $wid{$i} . 's%s', &amp;numjust($i, $d[$i]), $sep);<br>&#9;&#9;}<br>&#9;&#9;else {<br>&#9;    &#9;$rtn .= sprintf('%-' . $wid{$i} . 's%s', $d[$i], $sep);<br>&#9;&#9;}<br>    }<br>}<br><br>$Editor-&gt;InsText($rtn);<br><br>sub max {<br>    my($X, $Y) = @_;<br>    (($X &gt; $Y) ? $X : $Y);&#9;#??? gt &gt; chenge<br>}<br><br>sub numjust {<br>    my($n, $S) = @_;<br>    if($fwid{$n}){ # 小数以下部分あり<br>    &#9;my($i, $f) = split(/\./, $S);<br>    &#9;if($f){ # 小数以下の長さを最大合わせでスペースを補う<br>    &#9;&#9;$S .= substr($blanks, 1, $fwid{$n} - length($f));<br>    &#9;} else { # 小数点の分１桁も足す<br>    &#9;&#9;$S .= substr($blanks, 1, $fwid{$n} + 1);<br>    &#9;}<br>    }<br>    # position s in field n<br>    $S . substr($blanks, 1, int(($wid{$n} - $nwid{$n}) / 2));<br>}<br>__END__<br>プログラミング言語awkのサンプルからa2p変換して<br>さらに数値項目の小数点位置あわせを追加しました<br>「キー割り当て一覧のコピー」や表計算ソフトから<br>の出力などのタブ区切りの値をエディタ上で見易い<br>テーブル整形を行うPerlScriptです。<br>整形する範囲を選択してからこのマクロを実行。<br>end of script<br></div></section>
    </li></ul></body></html>